﻿#pragma once

#include <learn/dll_ext.h>
#include <learn/math/matrix.h>

#include <functional>

namespace xi
{

namespace alg
{

using namespace xi::math;

using Func11 = std::function<double(double)>;              // 一元函数 R -> R
using FuncX1 = std::function<double(VectorXd)>;            // 多元函数 Rn -> R
using Func1X = std::function<VectorXd(double)>;            // 一元向量函数 R -> Rn
using FuncXX = std::function<VectorXd(VectorXd)>;          // 多元向量函数 Rn -> Rm
using FuncXXt = std::function<VectorXd(VectorXd, double)>; // 多元 + t 向量函数

struct EXT_SYMBOL Alg_RootOfEquation
{
    /**
     * @brief 求解一元方程 f(x) = 0
     *
     * @param[in] f
     * @param[in] x
     * @return double
     */
    static double solve(Func11 f, double x);

    /**
     * @brief 求解多元方程 f(x) = 0
     *
     * @param[in] f
     * @param[in] x
     * @return VectorXd
     */
    static VectorXd solve(FuncXX f, VectorXd x);
};

} // namespace alg

} // namespace xi
